/******************************************************************************
 *      Mestrado em Ciência da Computação - UFMS
 *		Redes de Computadores - Prof. Dr. Ronaldo Alves Ferreira
 *		Alunos: Geraldo Landre, Marcel Tolentino, Vinícius Bueno
 *****************************************************************************/
 
#include "socket.h"

/*	#########################################################################
	############## Implementação das funções
	######################################################################### */

/*	implementação sock_open
	parâmetro errormsg para debug */
int sock_open(struct addrinfo* res)
{
	int sockfd;
	/* abre o socket */
	int domain, type, protocol;
	domain = res->ai_family;
	type = res->ai_socktype;
	protocol = res->ai_protocol;
	
	sockfd = socket(domain, type, protocol);
	
	return sockfd;
}

/* implementação sock_reuseaddr */
int sock_reuseaddr(int sockfd)
{
	/* set SO_REUSEADDR on a socket to true (1): */
	int optval = 1;
	int status = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);
	if(status == -1)
	{
		perror("Erro ao atribuir SO_REUSEADDR: ");
	}
	
	return status;
}

/*	implementação sock_close
	parâmetro label é para debug. */
void sock_close(int sockfd, char* label)
{
	if(sockfd == -1)
	{
		printf("%s não foi aberto...\n", label);
	}
	else
	{
		/*	fechar socket do servidor
			close the socket
			retorna 0 em caso de sucesso */
		if( close(sockfd) != 0 )
		{
			fprintf(stderr, "erro ao fechar %s!\n", label);
		}
		else
			printf("%s fechado com sucesso!\n", label);
	}
}

